命名
- 不要使用自定义的编码规则(类似 txt,img 这样的前缀)
- 命名应可以直接读出来
- 去除无意义的部分(类似 manager,process 这种),清晰表达一个概念或动作
- 类名应使用名词
使用描述了参数的静态工厂方法名来重载构造器
123Complex fulcrumPoint = Complex.FromRealNumber(23);好于Complex fulcrumPoint = new Complex(23);不要使用意义相近的词描述不同的概念(命名应该保持一种规范)
函数
- 函数应该尽量短小,只用来做一件事
- 尽量避免switch语句,采用多态的设计来替代
- 传入不超过两个的参数(其他参数可以想办法提取为类成员变量)
- 错误处理应该独占一个函数
- 消除不同函数中重复的代码(通过提取公共函数)
注释
- 好的代码不应该有注释(通过命名来解释逻辑)
- 注释可以用来描述看似不合理之物的重要性
- 不要注释不在使用的代码,直接删掉!
格式
- 统一的格式,缩进,代码行最大长度等
- 源文件最顶部应该给出高层次的概念和逻辑,细节往下逐渐展开
对象和数据结构
- 隐藏内部结构(实现细节)
- 对象的方法应该被用来执行某个动作,得到结果,而不是暴露内部数据
错误处理
- 不要返回、传递null值(这只会加大别人的调用成本)
边界
- 为不能控制的库代码提供封装,保证边界可控
测试
- 测试代码应在生产代码之前编写
- 快速、独立、可重复、自足验证、及时
类
- 一个类只应该有一个权责
- 类应该在保持短小的基础上做到高内聚(方法和全局变量联系紧密)
- 将多个函数共同需要的参数提升为类的变量(维持函数参数的数量),然后在发现类失去了内聚性的时候将类拆分